import 'dart:convert';

class SjStrategyData {
    bool? isMatchCallFree;
    int? initTab;
    bool? isShowMatchGender;
    SjGenderMatchCoin? genderMatchCoin;
    bool? isReviewPkg;
    bool? isShowLp;
    int? lpDiscount;
    int? lpPromotionDiscount;
    List<String>? payChannels;
    bool? isMaskOpen;
    bool? isShowBroadcasterRank;
    int? payScriptUserCoins;
    int? payScriptTriggerSecond;
    bool? isAutoAccept;
    List<String>? broadcasterWallTags;
    List<dynamic>? liveWallTagList;
    int? tabType;
    bool? isOpenBroacasterInvitation;
    bool? isOpenFlashChat;
    List<String>? videoStreamCategory;
    SjFlashChatConfig? flashChatConfig;
    bool? isShowMatch;
    bool? isNewTppUsable;
    SjUserInvitation? userInvitation;
    List<dynamic>? topOfficialUserIds;
    List<String>? reviewOfficialBlacklistUserIds;
    List<String>? officialBlacklistUserIds;
    List<String>? imIncentiveBlacklistUserIds;
    List<String>? broadcasterFollowOfficialUserIds;
    bool? isDisplayNotDisturbCall;
    bool? isDisplayNotDisturbIm;
    int? imSessionBalance;
    bool? isShowFlowInfo;
    bool? isShowDeletedButton;
    List<SjBroadcasterWallTagList>? broadcasterWallTagList;
    String? freeUserCallStaySecond;
    String? freeUserImStaySecond;
    String? rechargeUserCallStaySecond;
    String? rechargeUserImStaySecond;
    bool? isRandomUploadPaidEvents;
    bool? isSwitchImLimit;
    bool? isSwitchOneKeyFollow;
    bool? isSwitchImIncentive;
    bool? isSwitchClub;
    bool? isShowRookieGuide;
    bool? isSwitchStrongGuide;
    bool? isCallRearCamera;
    bool? isCallCameraClose;
    bool? isShowAutoTranslate;
    bool? isSilence;
    bool? isRearCamera;
    bool? isCloseCamera;
    bool? isSwitchInstruct;
    bool? isForceEvaluationInstruct;
    bool? isSwitchExtraCategory;
    bool? isSwitchMultipleCall;
    String? timestamp;
    int? sayHiMaxCount;
    List<String>? sayHiQuickPhrases;
    String? userServiceAccountId;
    List<dynamic>? broadcasterWallRegions;
    int? userMultipleLevel;
    bool? isReportFb;
    bool? isEnableGuardian;
    bool? isEnableCallCard;
    bool? isOpenSpeechToText;
    SjVoiceToTextConfig? voiceToTextConfig;
    bool? isEnableGroupSend;
    bool? supportShowRoom;
    int? newRelationMsgSizeLimit;
    int? unansweredGreetingExpireTtlHour;
    bool? isOpenFlashChatOnRole;
    String? broadcasterOnlineButton;
    String? indiaWallCallButtonUi;
    String? indianWallUnlock;
    int? callingSeconds;
    bool? isGuideInMode;
    bool? appPraiseSwitch;
    int? liveComboLimitTime;
    bool? hideCountryFromLive;
    SjVideoCallConfig? videoCallConfig;
    List<String>? highLightUnreadOfficialUserIds;
    SjMultiGuestConfig? multiGuestConfig;
    bool? isSwitchSubscription;
    bool? openLiveUnderReview;
    String? h5TaskUrl;
    bool? isCr;
    List<dynamic>? imSessionBroadcasterIds;

    SjStrategyData({
        this.isMatchCallFree,
        this.initTab,
        this.isShowMatchGender,
        this.genderMatchCoin,
        this.isReviewPkg,
        this.isShowLp,
        this.lpDiscount,
        this.lpPromotionDiscount,
        this.payChannels,
        this.isMaskOpen,
        this.isShowBroadcasterRank,
        this.payScriptUserCoins,
        this.payScriptTriggerSecond,
        this.isAutoAccept,
        this.broadcasterWallTags,
        this.liveWallTagList,
        this.tabType,
        this.isOpenBroacasterInvitation,
        this.isOpenFlashChat,
        this.videoStreamCategory,
        this.flashChatConfig,
        this.isShowMatch,
        this.isNewTppUsable,
        this.userInvitation,
        this.topOfficialUserIds,
        this.reviewOfficialBlacklistUserIds,
        this.officialBlacklistUserIds,
        this.imIncentiveBlacklistUserIds,
        this.broadcasterFollowOfficialUserIds,
        this.isDisplayNotDisturbCall,
        this.isDisplayNotDisturbIm,
        this.imSessionBalance,
        this.isShowFlowInfo,
        this.isShowDeletedButton,
        this.broadcasterWallTagList,
        this.freeUserCallStaySecond,
        this.freeUserImStaySecond,
        this.rechargeUserCallStaySecond,
        this.rechargeUserImStaySecond,
        this.isRandomUploadPaidEvents,
        this.isSwitchImLimit,
        this.isSwitchOneKeyFollow,
        this.isSwitchImIncentive,
        this.isSwitchClub,
        this.isShowRookieGuide,
        this.isSwitchStrongGuide,
        this.isCallRearCamera,
        this.isCallCameraClose,
        this.isShowAutoTranslate,
        this.isSilence,
        this.isRearCamera,
        this.isCloseCamera,
        this.isSwitchInstruct,
        this.isForceEvaluationInstruct,
        this.isSwitchExtraCategory,
        this.isSwitchMultipleCall,
        this.timestamp,
        this.sayHiMaxCount,
        this.sayHiQuickPhrases,
        this.userServiceAccountId,
        this.broadcasterWallRegions,
        this.userMultipleLevel,
        this.isReportFb,
        this.isEnableGuardian,
        this.isEnableCallCard,
        this.isOpenSpeechToText,
        this.voiceToTextConfig,
        this.isEnableGroupSend,
        this.supportShowRoom,
        this.newRelationMsgSizeLimit,
        this.unansweredGreetingExpireTtlHour,
        this.isOpenFlashChatOnRole,
        this.broadcasterOnlineButton,
        this.indiaWallCallButtonUi,
        this.indianWallUnlock,
        this.callingSeconds,
        this.isGuideInMode,
        this.appPraiseSwitch,
        this.liveComboLimitTime,
        this.hideCountryFromLive,
        this.videoCallConfig,
        this.highLightUnreadOfficialUserIds,
        this.multiGuestConfig,
        this.isSwitchSubscription,
        this.openLiveUnderReview,
        this.h5TaskUrl,
        this.isCr,
        this.imSessionBroadcasterIds,
    });

    SjStrategyData copyWith({
        bool? isMatchCallFree,
        int? initTab,
        bool? isShowMatchGender,
        SjGenderMatchCoin? genderMatchCoin,
        bool? isReviewPkg,
        bool? isShowLp,
        int? lpDiscount,
        int? lpPromotionDiscount,
        List<String>? payChannels,
        bool? isMaskOpen,
        bool? isShowBroadcasterRank,
        int? payScriptUserCoins,
        int? payScriptTriggerSecond,
        bool? isAutoAccept,
        List<String>? broadcasterWallTags,
        List<dynamic>? liveWallTagList,
        int? tabType,
        bool? isOpenBroacasterInvitation,
        bool? isOpenFlashChat,
        List<String>? videoStreamCategory,
        SjFlashChatConfig? flashChatConfig,
        bool? isShowMatch,
        bool? isNewTppUsable,
        SjUserInvitation? userInvitation,
        List<dynamic>? topOfficialUserIds,
        List<String>? reviewOfficialBlacklistUserIds,
        List<String>? officialBlacklistUserIds,
        List<String>? imIncentiveBlacklistUserIds,
        List<String>? broadcasterFollowOfficialUserIds,
        bool? isDisplayNotDisturbCall,
        bool? isDisplayNotDisturbIm,
        int? imSessionBalance,
        bool? isShowFlowInfo,
        bool? isShowDeletedButton,
        List<SjBroadcasterWallTagList>? broadcasterWallTagList,
        String? freeUserCallStaySecond,
        String? freeUserImStaySecond,
        String? rechargeUserCallStaySecond,
        String? rechargeUserImStaySecond,
        bool? isRandomUploadPaidEvents,
        bool? isSwitchImLimit,
        bool? isSwitchOneKeyFollow,
        bool? isSwitchImIncentive,
        bool? isSwitchClub,
        bool? isShowRookieGuide,
        bool? isSwitchStrongGuide,
        bool? isCallRearCamera,
        bool? isCallCameraClose,
        bool? isShowAutoTranslate,
        bool? isSilence,
        bool? isRearCamera,
        bool? isCloseCamera,
        bool? isSwitchInstruct,
        bool? isForceEvaluationInstruct,
        bool? isSwitchExtraCategory,
        bool? isSwitchMultipleCall,
        String? timestamp,
        int? sayHiMaxCount,
        List<String>? sayHiQuickPhrases,
        String? userServiceAccountId,
        List<dynamic>? broadcasterWallRegions,
        int? userMultipleLevel,
        bool? isReportFb,
        bool? isEnableGuardian,
        bool? isEnableCallCard,
        bool? isOpenSpeechToText,
        SjVoiceToTextConfig? voiceToTextConfig,
        bool? isEnableGroupSend,
        bool? supportShowRoom,
        int? newRelationMsgSizeLimit,
        int? unansweredGreetingExpireTtlHour,
        bool? isOpenFlashChatOnRole,
        String? broadcasterOnlineButton,
        String? indiaWallCallButtonUi,
        String? indianWallUnlock,
        int? callingSeconds,
        bool? isGuideInMode,
        bool? appPraiseSwitch,
        int? liveComboLimitTime,
        bool? hideCountryFromLive,
        SjVideoCallConfig? videoCallConfig,
        List<String>? highLightUnreadOfficialUserIds,
        SjMultiGuestConfig? multiGuestConfig,
        bool? isSwitchSubscription,
        bool? openLiveUnderReview,
        String? h5TaskUrl,
        bool? isCr,
        List<dynamic>? imSessionBroadcasterIds,
    }) => 
        SjStrategyData(
            isMatchCallFree: isMatchCallFree ?? this.isMatchCallFree,
            initTab: initTab ?? this.initTab,
            isShowMatchGender: isShowMatchGender ?? this.isShowMatchGender,
            genderMatchCoin: genderMatchCoin ?? this.genderMatchCoin,
            isReviewPkg: isReviewPkg ?? this.isReviewPkg,
            isShowLp: isShowLp ?? this.isShowLp,
            lpDiscount: lpDiscount ?? this.lpDiscount,
            lpPromotionDiscount: lpPromotionDiscount ?? this.lpPromotionDiscount,
            payChannels: payChannels ?? this.payChannels,
            isMaskOpen: isMaskOpen ?? this.isMaskOpen,
            isShowBroadcasterRank: isShowBroadcasterRank ?? this.isShowBroadcasterRank,
            payScriptUserCoins: payScriptUserCoins ?? this.payScriptUserCoins,
            payScriptTriggerSecond: payScriptTriggerSecond ?? this.payScriptTriggerSecond,
            isAutoAccept: isAutoAccept ?? this.isAutoAccept,
            broadcasterWallTags: broadcasterWallTags ?? this.broadcasterWallTags,
            liveWallTagList: liveWallTagList ?? this.liveWallTagList,
            tabType: tabType ?? this.tabType,
            isOpenBroacasterInvitation: isOpenBroacasterInvitation ?? this.isOpenBroacasterInvitation,
            isOpenFlashChat: isOpenFlashChat ?? this.isOpenFlashChat,
            videoStreamCategory: videoStreamCategory ?? this.videoStreamCategory,
            flashChatConfig: flashChatConfig ?? this.flashChatConfig,
            isShowMatch: isShowMatch ?? this.isShowMatch,
            isNewTppUsable: isNewTppUsable ?? this.isNewTppUsable,
            userInvitation: userInvitation ?? this.userInvitation,
            topOfficialUserIds: topOfficialUserIds ?? this.topOfficialUserIds,
            reviewOfficialBlacklistUserIds: reviewOfficialBlacklistUserIds ?? this.reviewOfficialBlacklistUserIds,
            officialBlacklistUserIds: officialBlacklistUserIds ?? this.officialBlacklistUserIds,
            imIncentiveBlacklistUserIds: imIncentiveBlacklistUserIds ?? this.imIncentiveBlacklistUserIds,
            broadcasterFollowOfficialUserIds: broadcasterFollowOfficialUserIds ?? this.broadcasterFollowOfficialUserIds,
            isDisplayNotDisturbCall: isDisplayNotDisturbCall ?? this.isDisplayNotDisturbCall,
            isDisplayNotDisturbIm: isDisplayNotDisturbIm ?? this.isDisplayNotDisturbIm,
            imSessionBalance: imSessionBalance ?? this.imSessionBalance,
            isShowFlowInfo: isShowFlowInfo ?? this.isShowFlowInfo,
            isShowDeletedButton: isShowDeletedButton ?? this.isShowDeletedButton,
            broadcasterWallTagList: broadcasterWallTagList ?? this.broadcasterWallTagList,
            freeUserCallStaySecond: freeUserCallStaySecond ?? this.freeUserCallStaySecond,
            freeUserImStaySecond: freeUserImStaySecond ?? this.freeUserImStaySecond,
            rechargeUserCallStaySecond: rechargeUserCallStaySecond ?? this.rechargeUserCallStaySecond,
            rechargeUserImStaySecond: rechargeUserImStaySecond ?? this.rechargeUserImStaySecond,
            isRandomUploadPaidEvents: isRandomUploadPaidEvents ?? this.isRandomUploadPaidEvents,
            isSwitchImLimit: isSwitchImLimit ?? this.isSwitchImLimit,
            isSwitchOneKeyFollow: isSwitchOneKeyFollow ?? this.isSwitchOneKeyFollow,
            isSwitchImIncentive: isSwitchImIncentive ?? this.isSwitchImIncentive,
            isSwitchClub: isSwitchClub ?? this.isSwitchClub,
            isShowRookieGuide: isShowRookieGuide ?? this.isShowRookieGuide,
            isSwitchStrongGuide: isSwitchStrongGuide ?? this.isSwitchStrongGuide,
            isCallRearCamera: isCallRearCamera ?? this.isCallRearCamera,
            isCallCameraClose: isCallCameraClose ?? this.isCallCameraClose,
            isShowAutoTranslate: isShowAutoTranslate ?? this.isShowAutoTranslate,
            isSilence: isSilence ?? this.isSilence,
            isRearCamera: isRearCamera ?? this.isRearCamera,
            isCloseCamera: isCloseCamera ?? this.isCloseCamera,
            isSwitchInstruct: isSwitchInstruct ?? this.isSwitchInstruct,
            isForceEvaluationInstruct: isForceEvaluationInstruct ?? this.isForceEvaluationInstruct,
            isSwitchExtraCategory: isSwitchExtraCategory ?? this.isSwitchExtraCategory,
            isSwitchMultipleCall: isSwitchMultipleCall ?? this.isSwitchMultipleCall,
            timestamp: timestamp ?? this.timestamp,
            sayHiMaxCount: sayHiMaxCount ?? this.sayHiMaxCount,
            sayHiQuickPhrases: sayHiQuickPhrases ?? this.sayHiQuickPhrases,
            userServiceAccountId: userServiceAccountId ?? this.userServiceAccountId,
            broadcasterWallRegions: broadcasterWallRegions ?? this.broadcasterWallRegions,
            userMultipleLevel: userMultipleLevel ?? this.userMultipleLevel,
            isReportFb: isReportFb ?? this.isReportFb,
            isEnableGuardian: isEnableGuardian ?? this.isEnableGuardian,
            isEnableCallCard: isEnableCallCard ?? this.isEnableCallCard,
            isOpenSpeechToText: isOpenSpeechToText ?? this.isOpenSpeechToText,
            voiceToTextConfig: voiceToTextConfig ?? this.voiceToTextConfig,
            isEnableGroupSend: isEnableGroupSend ?? this.isEnableGroupSend,
            supportShowRoom: supportShowRoom ?? this.supportShowRoom,
            newRelationMsgSizeLimit: newRelationMsgSizeLimit ?? this.newRelationMsgSizeLimit,
            unansweredGreetingExpireTtlHour: unansweredGreetingExpireTtlHour ?? this.unansweredGreetingExpireTtlHour,
            isOpenFlashChatOnRole: isOpenFlashChatOnRole ?? this.isOpenFlashChatOnRole,
            broadcasterOnlineButton: broadcasterOnlineButton ?? this.broadcasterOnlineButton,
            indiaWallCallButtonUi: indiaWallCallButtonUi ?? this.indiaWallCallButtonUi,
            indianWallUnlock: indianWallUnlock ?? this.indianWallUnlock,
            callingSeconds: callingSeconds ?? this.callingSeconds,
            isGuideInMode: isGuideInMode ?? this.isGuideInMode,
            appPraiseSwitch: appPraiseSwitch ?? this.appPraiseSwitch,
            liveComboLimitTime: liveComboLimitTime ?? this.liveComboLimitTime,
            hideCountryFromLive: hideCountryFromLive ?? this.hideCountryFromLive,
            videoCallConfig: videoCallConfig ?? this.videoCallConfig,
            highLightUnreadOfficialUserIds: highLightUnreadOfficialUserIds ?? this.highLightUnreadOfficialUserIds,
            multiGuestConfig: multiGuestConfig ?? this.multiGuestConfig,
            isSwitchSubscription: isSwitchSubscription ?? this.isSwitchSubscription,
            openLiveUnderReview: openLiveUnderReview ?? this.openLiveUnderReview,
            h5TaskUrl: h5TaskUrl ?? this.h5TaskUrl,
            isCr: isCr ?? this.isCr,
            imSessionBroadcasterIds: imSessionBroadcasterIds ?? this.imSessionBroadcasterIds,
        );

    factory SjStrategyData.fromRawJson(String str) => SjStrategyData.fromJson(json.decode(str));

    String toRawJson() => json.encode(toJson());

    factory SjStrategyData.fromJson(Map<String, dynamic> json) => SjStrategyData(
        isMatchCallFree: json["isMatchCallFree"],
        initTab: json["initTab"],
        isShowMatchGender: json["isShowMatchGender"],
        genderMatchCoin: json["genderMatchCoin"] == null ? null : SjGenderMatchCoin.fromJson(json["genderMatchCoin"]),
        isReviewPkg: json["isReviewPkg"],
        isShowLp: json["isShowLP"],
        lpDiscount: json["lpDiscount"],
        lpPromotionDiscount: json["lpPromotionDiscount"],
        payChannels: json["payChannels"] == null ? [] : List<String>.from(json["payChannels"]!.map((x) => x)),
        isMaskOpen: json["isMaskOpen"],
        isShowBroadcasterRank: json["isShowBroadcasterRank"],
        payScriptUserCoins: json["payScriptUserCoins"],
        payScriptTriggerSecond: json["payScriptTriggerSecond"],
        isAutoAccept: json["isAutoAccept"],
        broadcasterWallTags: json["broadcasterWallTags"] == null ? [] : List<String>.from(json["broadcasterWallTags"]!.map((x) => x)),
        liveWallTagList: json["liveWallTagList"] == null ? [] : List<dynamic>.from(json["liveWallTagList"]!.map((x) => x)),
        tabType: json["tabType"],
        isOpenBroacasterInvitation: json["isOpenBroacasterInvitation"],
        isOpenFlashChat: json["isOpenFlashChat"],
        videoStreamCategory: json["videoStreamCategory"] == null ? [] : List<String>.from(json["videoStreamCategory"]!.map((x) => x)),
        flashChatConfig: json["flashChatConfig"] == null ? null : SjFlashChatConfig.fromJson(json["flashChatConfig"]),
        isShowMatch: json["isShowMatch"],
        isNewTppUsable: json["isNewTppUsable"],
        userInvitation: json["userInvitation"] == null ? null : SjUserInvitation.fromJson(json["userInvitation"]),
        topOfficialUserIds: json["topOfficialUserIds"] == null ? [] : List<dynamic>.from(json["topOfficialUserIds"]!.map((x) => x)),
        reviewOfficialBlacklistUserIds: json["reviewOfficialBlacklistUserIds"] == null ? [] : List<String>.from(json["reviewOfficialBlacklistUserIds"]!.map((x) => x)),
        officialBlacklistUserIds: json["officialBlacklistUserIds"] == null ? [] : List<String>.from(json["officialBlacklistUserIds"]!.map((x) => x)),
        imIncentiveBlacklistUserIds: json["imIncentiveBlacklistUserIds"] == null ? [] : List<String>.from(json["imIncentiveBlacklistUserIds"]!.map((x) => x)),
        broadcasterFollowOfficialUserIds: json["broadcasterFollowOfficialUserIds"] == null ? [] : List<String>.from(json["broadcasterFollowOfficialUserIds"]!.map((x) => x)),
        isDisplayNotDisturbCall: json["isDisplayNotDisturbCall"],
        isDisplayNotDisturbIm: json["isDisplayNotDisturbIm"],
        imSessionBalance: json["imSessionBalance"],
        isShowFlowInfo: json["isShowFlowInfo"],
        isShowDeletedButton: json["isShowDeletedButton"],
        broadcasterWallTagList: json["broadcasterWallTagList"] == null ? [] : List<SjBroadcasterWallTagList>.from(json["broadcasterWallTagList"]!.map((x) => SjBroadcasterWallTagList.fromJson(x))),
        freeUserCallStaySecond: json["freeUserCallStaySecond"],
        freeUserImStaySecond: json["freeUserImStaySecond"],
        rechargeUserCallStaySecond: json["rechargeUserCallStaySecond"],
        rechargeUserImStaySecond: json["rechargeUserImStaySecond"],
        isRandomUploadPaidEvents: json["isRandomUploadPaidEvents"],
        isSwitchImLimit: json["isSwitchIMLimit"],
        isSwitchOneKeyFollow: json["isSwitchOneKeyFollow"],
        isSwitchImIncentive: json["isSwitchIMIncentive"],
        isSwitchClub: json["isSwitchClub"],
        isShowRookieGuide: json["isShowRookieGuide"],
        isSwitchStrongGuide: json["isSwitchStrongGuide"],
        isCallRearCamera: json["isCallRearCamera"],
        isCallCameraClose: json["isCallCameraClose"],
        isShowAutoTranslate: json["isShowAutoTranslate"],
        isSilence: json["isSilence"],
        isRearCamera: json["isRearCamera"],
        isCloseCamera: json["isCloseCamera"],
        isSwitchInstruct: json["isSwitchInstruct"],
        isForceEvaluationInstruct: json["isForceEvaluationInstruct"],
        isSwitchExtraCategory: json["isSwitchExtraCategory"],
        isSwitchMultipleCall: json["isSwitchMultipleCall"],
        timestamp: json["timestamp"],
        sayHiMaxCount: json["sayHiMaxCount"],
        sayHiQuickPhrases: json["sayHiQuickPhrases"] == null ? [] : List<String>.from(json["sayHiQuickPhrases"]!.map((x) => x)),
        userServiceAccountId: json["userServiceAccountId"],
        broadcasterWallRegions: json["broadcasterWallRegions"] == null ? [] : List<dynamic>.from(json["broadcasterWallRegions"]!.map((x) => x)),
        userMultipleLevel: json["userMultipleLevel"],
        isReportFb: json["isReportFB"],
        isEnableGuardian: json["isEnableGuardian"],
        isEnableCallCard: json["isEnableCallCard"],
        isOpenSpeechToText: json["isOpenSpeechToText"],
        voiceToTextConfig: json["voiceToTextConfig"] == null ? null : SjVoiceToTextConfig.fromJson(json["voiceToTextConfig"]),
        isEnableGroupSend: json["isEnableGroupSend"],
        supportShowRoom: json["supportShowRoom"],
        newRelationMsgSizeLimit: json["newRelationMsgSizeLimit"],
        unansweredGreetingExpireTtlHour: json["unansweredGreetingExpireTTLHour"],
        isOpenFlashChatOnRole: json["isOpenFlashChatOnRole"],
        broadcasterOnlineButton: json["broadcasterOnlineButton"],
        indiaWallCallButtonUi: json["indiaWallCallButtonUI"],
        indianWallUnlock: json["indianWallUnlock"],
        callingSeconds: json["callingSeconds"],
        isGuideInMode: json["isGuideInMode"],
        appPraiseSwitch: json["appPraiseSwitch"],
        liveComboLimitTime: json["liveComboLimitTime"],
        hideCountryFromLive: json["hideCountryFromLive"],
        videoCallConfig: json["videoCallConfig"] == null ? null : SjVideoCallConfig.fromJson(json["videoCallConfig"]),
        highLightUnreadOfficialUserIds: json["highLightUnreadOfficialUserIds"] == null ? [] : List<String>.from(json["highLightUnreadOfficialUserIds"]!.map((x) => x)),
        multiGuestConfig: json["multiGuestConfig"] == null ? null : SjMultiGuestConfig.fromJson(json["multiGuestConfig"]),
        isSwitchSubscription: json["isSwitchSubscription"],
        openLiveUnderReview: json["openLiveUnderReview"],
        h5TaskUrl: json["h5TaskUrl"],
        isCr: json["isCR"],
        imSessionBroadcasterIds: json["imSessionBroadcasterIds"] == null ? [] : List<dynamic>.from(json["imSessionBroadcasterIds"]!.map((x) => x)),
    );

    Map<String, dynamic> toJson() => {
        "isMatchCallFree": isMatchCallFree,
        "initTab": initTab,
        "isShowMatchGender": isShowMatchGender,
        "genderMatchCoin": genderMatchCoin?.toJson(),
        "isReviewPkg": isReviewPkg,
        "isShowLP": isShowLp,
        "lpDiscount": lpDiscount,
        "lpPromotionDiscount": lpPromotionDiscount,
        "payChannels": payChannels == null ? [] : List<dynamic>.from(payChannels!.map((x) => x)),
        "isMaskOpen": isMaskOpen,
        "isShowBroadcasterRank": isShowBroadcasterRank,
        "payScriptUserCoins": payScriptUserCoins,
        "payScriptTriggerSecond": payScriptTriggerSecond,
        "isAutoAccept": isAutoAccept,
        "broadcasterWallTags": broadcasterWallTags == null ? [] : List<dynamic>.from(broadcasterWallTags!.map((x) => x)),
        "liveWallTagList": liveWallTagList == null ? [] : List<dynamic>.from(liveWallTagList!.map((x) => x)),
        "tabType": tabType,
        "isOpenBroacasterInvitation": isOpenBroacasterInvitation,
        "isOpenFlashChat": isOpenFlashChat,
        "videoStreamCategory": videoStreamCategory == null ? [] : List<dynamic>.from(videoStreamCategory!.map((x) => x)),
        "flashChatConfig": flashChatConfig?.toJson(),
        "isShowMatch": isShowMatch,
        "isNewTppUsable": isNewTppUsable,
        "userInvitation": userInvitation?.toJson(),
        "topOfficialUserIds": topOfficialUserIds == null ? [] : List<dynamic>.from(topOfficialUserIds!.map((x) => x)),
        "reviewOfficialBlacklistUserIds": reviewOfficialBlacklistUserIds == null ? [] : List<dynamic>.from(reviewOfficialBlacklistUserIds!.map((x) => x)),
        "officialBlacklistUserIds": officialBlacklistUserIds == null ? [] : List<dynamic>.from(officialBlacklistUserIds!.map((x) => x)),
        "imIncentiveBlacklistUserIds": imIncentiveBlacklistUserIds == null ? [] : List<dynamic>.from(imIncentiveBlacklistUserIds!.map((x) => x)),
        "broadcasterFollowOfficialUserIds": broadcasterFollowOfficialUserIds == null ? [] : List<dynamic>.from(broadcasterFollowOfficialUserIds!.map((x) => x)),
        "isDisplayNotDisturbCall": isDisplayNotDisturbCall,
        "isDisplayNotDisturbIm": isDisplayNotDisturbIm,
        "imSessionBalance": imSessionBalance,
        "isShowFlowInfo": isShowFlowInfo,
        "isShowDeletedButton": isShowDeletedButton,
        "broadcasterWallTagList": broadcasterWallTagList == null ? [] : List<dynamic>.from(broadcasterWallTagList!.map((x) => x.toJson())),
        "freeUserCallStaySecond": freeUserCallStaySecond,
        "freeUserImStaySecond": freeUserImStaySecond,
        "rechargeUserCallStaySecond": rechargeUserCallStaySecond,
        "rechargeUserImStaySecond": rechargeUserImStaySecond,
        "isRandomUploadPaidEvents": isRandomUploadPaidEvents,
        "isSwitchIMLimit": isSwitchImLimit,
        "isSwitchOneKeyFollow": isSwitchOneKeyFollow,
        "isSwitchIMIncentive": isSwitchImIncentive,
        "isSwitchClub": isSwitchClub,
        "isShowRookieGuide": isShowRookieGuide,
        "isSwitchStrongGuide": isSwitchStrongGuide,
        "isCallRearCamera": isCallRearCamera,
        "isCallCameraClose": isCallCameraClose,
        "isShowAutoTranslate": isShowAutoTranslate,
        "isSilence": isSilence,
        "isRearCamera": isRearCamera,
        "isCloseCamera": isCloseCamera,
        "isSwitchInstruct": isSwitchInstruct,
        "isForceEvaluationInstruct": isForceEvaluationInstruct,
        "isSwitchExtraCategory": isSwitchExtraCategory,
        "isSwitchMultipleCall": isSwitchMultipleCall,
        "timestamp": timestamp,
        "sayHiMaxCount": sayHiMaxCount,
        "sayHiQuickPhrases": sayHiQuickPhrases == null ? [] : List<dynamic>.from(sayHiQuickPhrases!.map((x) => x)),
        "userServiceAccountId": userServiceAccountId,
        "broadcasterWallRegions": broadcasterWallRegions == null ? [] : List<dynamic>.from(broadcasterWallRegions!.map((x) => x)),
        "userMultipleLevel": userMultipleLevel,
        "isReportFB": isReportFb,
        "isEnableGuardian": isEnableGuardian,
        "isEnableCallCard": isEnableCallCard,
        "isOpenSpeechToText": isOpenSpeechToText,
        "voiceToTextConfig": voiceToTextConfig?.toJson(),
        "isEnableGroupSend": isEnableGroupSend,
        "supportShowRoom": supportShowRoom,
        "newRelationMsgSizeLimit": newRelationMsgSizeLimit,
        "unansweredGreetingExpireTTLHour": unansweredGreetingExpireTtlHour,
        "isOpenFlashChatOnRole": isOpenFlashChatOnRole,
        "broadcasterOnlineButton": broadcasterOnlineButton,
        "indiaWallCallButtonUI": indiaWallCallButtonUi,
        "indianWallUnlock": indianWallUnlock,
        "callingSeconds": callingSeconds,
        "isGuideInMode": isGuideInMode,
        "appPraiseSwitch": appPraiseSwitch,
        "liveComboLimitTime": liveComboLimitTime,
        "hideCountryFromLive": hideCountryFromLive,
        "videoCallConfig": videoCallConfig?.toJson(),
        "highLightUnreadOfficialUserIds": highLightUnreadOfficialUserIds == null ? [] : List<dynamic>.from(highLightUnreadOfficialUserIds!.map((x) => x)),
        "multiGuestConfig": multiGuestConfig?.toJson(),
        "isSwitchSubscription": isSwitchSubscription,
        "openLiveUnderReview": openLiveUnderReview,
        "h5TaskUrl": h5TaskUrl,
        "isCR": isCr,
        "imSessionBroadcasterIds": imSessionBroadcasterIds == null ? [] : List<dynamic>.from(imSessionBroadcasterIds!.map((x) => x)),
    };
}

class SjBroadcasterWallTagList {
    String? tagName;
    List<String>? subTagList;
    int? subTagInitIndex;

    SjBroadcasterWallTagList({
        this.tagName,
        this.subTagList,
        this.subTagInitIndex,
    });

    SjBroadcasterWallTagList copyWith({
        String? tagName,
        List<String>? subTagList,
        int? subTagInitIndex,
    }) => 
        SjBroadcasterWallTagList(
            tagName: tagName ?? this.tagName,
            subTagList: subTagList ?? this.subTagList,
            subTagInitIndex: subTagInitIndex ?? this.subTagInitIndex,
        );

    factory SjBroadcasterWallTagList.fromRawJson(String str) => SjBroadcasterWallTagList.fromJson(json.decode(str));

    String toRawJson() => json.encode(toJson());

    factory SjBroadcasterWallTagList.fromJson(Map<String, dynamic> json) => SjBroadcasterWallTagList(
        tagName: json["tagName"],
        subTagList: json["subTagList"] == null ? [] : List<String>.from(json["subTagList"]!.map((x) => x)),
        subTagInitIndex: json["subTagInitIndex"],
    );

    Map<String, dynamic> toJson() => {
        "tagName": tagName,
        "subTagList": subTagList == null ? [] : List<dynamic>.from(subTagList!.map((x) => x)),
        "subTagInitIndex": subTagInitIndex,
    };
}

class SjFlashChatConfig {
    bool? isSwitch;
    bool? isFreeCall;
    int? residueFreeCallTimes;

    SjFlashChatConfig({
        this.isSwitch,
        this.isFreeCall,
        this.residueFreeCallTimes,
    });

    SjFlashChatConfig copyWith({
        bool? isSwitch,
        bool? isFreeCall,
        int? residueFreeCallTimes,
    }) => 
        SjFlashChatConfig(
            isSwitch: isSwitch ?? this.isSwitch,
            isFreeCall: isFreeCall ?? this.isFreeCall,
            residueFreeCallTimes: residueFreeCallTimes ?? this.residueFreeCallTimes,
        );

    factory SjFlashChatConfig.fromRawJson(String str) => SjFlashChatConfig.fromJson(json.decode(str));

    String toRawJson() => json.encode(toJson());

    factory SjFlashChatConfig.fromJson(Map<String, dynamic> json) => SjFlashChatConfig(
        isSwitch: json["isSwitch"],
        isFreeCall: json["isFreeCall"],
        residueFreeCallTimes: json["residueFreeCallTimes"],
    );

    Map<String, dynamic> toJson() => {
        "isSwitch": isSwitch,
        "isFreeCall": isFreeCall,
        "residueFreeCallTimes": residueFreeCallTimes,
    };
}

class SjGenderMatchCoin {
    int? maleCoins;
    int? femaleCoins;
    int? bothCoins;
    int? vipGoddessCoins;
    int? goddessCoins;

    SjGenderMatchCoin({
        this.maleCoins,
        this.femaleCoins,
        this.bothCoins,
        this.vipGoddessCoins,
        this.goddessCoins,
    });

    SjGenderMatchCoin copyWith({
        int? maleCoins,
        int? femaleCoins,
        int? bothCoins,
        int? vipGoddessCoins,
        int? goddessCoins,
    }) => 
        SjGenderMatchCoin(
            maleCoins: maleCoins ?? this.maleCoins,
            femaleCoins: femaleCoins ?? this.femaleCoins,
            bothCoins: bothCoins ?? this.bothCoins,
            vipGoddessCoins: vipGoddessCoins ?? this.vipGoddessCoins,
            goddessCoins: goddessCoins ?? this.goddessCoins,
        );

    factory SjGenderMatchCoin.fromRawJson(String str) => SjGenderMatchCoin.fromJson(json.decode(str));

    String toRawJson() => json.encode(toJson());

    factory SjGenderMatchCoin.fromJson(Map<String, dynamic> json) => SjGenderMatchCoin(
        maleCoins: json["maleCoins"],
        femaleCoins: json["femaleCoins"],
        bothCoins: json["bothCoins"],
        vipGoddessCoins: json["vipGoddessCoins"],
        goddessCoins: json["goddessCoins"],
    );

    Map<String, dynamic> toJson() => {
        "maleCoins": maleCoins,
        "femaleCoins": femaleCoins,
        "bothCoins": bothCoins,
        "vipGoddessCoins": vipGoddessCoins,
        "goddessCoins": goddessCoins,
    };
}

class SjMultiGuestConfig {
    String? name;
    SjMultiGuestConfig({this.name});

    SjMultiGuestConfig copyWith({
      String? name
    }) => 
        SjMultiGuestConfig(
          name: name ?? this.name
        );

    factory SjMultiGuestConfig.fromRawJson(String str) => SjMultiGuestConfig.fromJson(json.decode(str));

    String toRawJson() => json.encode(toJson());

    factory SjMultiGuestConfig.fromJson(Map<String, dynamic> json) => SjMultiGuestConfig(
      name: json["name"]
    );

    Map<String, dynamic> toJson() => {
      "name": name
    };
}

class SjUserInvitation {
    String? tipsTitle;
    String? tipsContent;
    String? popUpTitle;
    String? popUpContent;
    String? popUpBottom;
    String? shareContent;

    SjUserInvitation({
        this.tipsTitle,
        this.tipsContent,
        this.popUpTitle,
        this.popUpContent,
        this.popUpBottom,
        this.shareContent,
    });

    SjUserInvitation copyWith({
        String? tipsTitle,
        String? tipsContent,
        String? popUpTitle,
        String? popUpContent,
        String? popUpBottom,
        String? shareContent,
    }) => 
        SjUserInvitation(
            tipsTitle: tipsTitle ?? this.tipsTitle,
            tipsContent: tipsContent ?? this.tipsContent,
            popUpTitle: popUpTitle ?? this.popUpTitle,
            popUpContent: popUpContent ?? this.popUpContent,
            popUpBottom: popUpBottom ?? this.popUpBottom,
            shareContent: shareContent ?? this.shareContent,
        );

    factory SjUserInvitation.fromRawJson(String str) => SjUserInvitation.fromJson(json.decode(str));

    String toRawJson() => json.encode(toJson());

    factory SjUserInvitation.fromJson(Map<String, dynamic> json) => SjUserInvitation(
        tipsTitle: json["tipsTitle"],
        tipsContent: json["tipsContent"],
        popUpTitle: json["popUpTitle"],
        popUpContent: json["popUpContent"],
        popUpBottom: json["popUpBottom"],
        shareContent: json["shareContent"],
    );

    Map<String, dynamic> toJson() => {
        "tipsTitle": tipsTitle,
        "tipsContent": tipsContent,
        "popUpTitle": popUpTitle,
        "popUpContent": popUpContent,
        "popUpBottom": popUpBottom,
        "shareContent": shareContent,
    };
}

class SjVideoCallConfig {
    List<List<String>>? callNoticeContent;
    int? firstSendDelaySecond;
    int? sendDelayMinSecond;
    int? sendDelayMaxSecond;

    SjVideoCallConfig({
        this.callNoticeContent,
        this.firstSendDelaySecond,
        this.sendDelayMinSecond,
        this.sendDelayMaxSecond,
    });

    SjVideoCallConfig copyWith({
        List<List<String>>? callNoticeContent,
        int? firstSendDelaySecond,
        int? sendDelayMinSecond,
        int? sendDelayMaxSecond,
    }) => 
        SjVideoCallConfig(
            callNoticeContent: callNoticeContent ?? this.callNoticeContent,
            firstSendDelaySecond: firstSendDelaySecond ?? this.firstSendDelaySecond,
            sendDelayMinSecond: sendDelayMinSecond ?? this.sendDelayMinSecond,
            sendDelayMaxSecond: sendDelayMaxSecond ?? this.sendDelayMaxSecond,
        );

    factory SjVideoCallConfig.fromRawJson(String str) => SjVideoCallConfig.fromJson(json.decode(str));

    String toRawJson() => json.encode(toJson());

    factory SjVideoCallConfig.fromJson(Map<String, dynamic> json) => SjVideoCallConfig(
        callNoticeContent: json["callNoticeContent"] == null ? [] : List<List<String>>.from(json["callNoticeContent"]!.map((x) => List<String>.from(x.map((x) => x)))),
        firstSendDelaySecond: json["firstSendDelaySecond"],
        sendDelayMinSecond: json["sendDelayMinSecond"],
        sendDelayMaxSecond: json["sendDelayMaxSecond"],
    );

    Map<String, dynamic> toJson() => {
        "callNoticeContent": callNoticeContent == null ? [] : List<dynamic>.from(callNoticeContent!.map((x) => List<dynamic>.from(x.map((x) => x)))),
        "firstSendDelaySecond": firstSendDelaySecond,
        "sendDelayMinSecond": sendDelayMinSecond,
        "sendDelayMaxSecond": sendDelayMaxSecond,
    };
}

class SjVoiceToTextConfig {
    bool? voiceToTextSwitch;
    int? voiceToTextUnitPrice;

    SjVoiceToTextConfig({
        this.voiceToTextSwitch,
        this.voiceToTextUnitPrice,
    });

    SjVoiceToTextConfig copyWith({
        bool? voiceToTextSwitch,
        int? voiceToTextUnitPrice,
    }) => 
        SjVoiceToTextConfig(
            voiceToTextSwitch: voiceToTextSwitch ?? this.voiceToTextSwitch,
            voiceToTextUnitPrice: voiceToTextUnitPrice ?? this.voiceToTextUnitPrice,
        );

    factory SjVoiceToTextConfig.fromRawJson(String str) => SjVoiceToTextConfig.fromJson(json.decode(str));

    String toRawJson() => json.encode(toJson());

    factory SjVoiceToTextConfig.fromJson(Map<String, dynamic> json) => SjVoiceToTextConfig(
        voiceToTextSwitch: json["voiceToTextSwitch"],
        voiceToTextUnitPrice: json["voiceToTextUnitPrice"],
    );

    Map<String, dynamic> toJson() => {
        "voiceToTextSwitch": voiceToTextSwitch,
        "voiceToTextUnitPrice": voiceToTextUnitPrice,
    };
}
